perm filename BITLAB.SOU[FOO,LMM] blob sn#092632 filedate 1974-03-21 generic text, type T, neo UTF8
COMMON((PICTURE))

DEFINE(((MLG(LAMBDA(NODES GROUP LABELS)

 (FOR NEW X IN

   (MANYLABELGRAPHTOP (LST-BNR NODES)(LST-BNRG GROUP)LABELS)

   DO (FOR NEW Y IN (CDR X) DO

        (PRINC (CAR Y))

         (PRINC(BNR-LST(CDR Y)))

        (XTAB 2))

      (COND((GET @ PICTURE @ APVAL)

        (FOR NEW I :=(1 (FOR NEW II IN PICTURE MAX (CADR II))) DO

             (TERPRI)

             (FOR NEW P IN PICTURE WHEN (EQUAL I (CADR P))

        AS NEW ELT IS (LST-BNR (CAR P))

                   AS NEW Y IS X DO

                    (COND((NOT(NUMBERP(CAR P)))(GO L2)))

                    (TTAB (CDDR P))

    L1              (COND((NULL(SETQ Y(CDR Y)))(PRIN1 @ ?))

                         ((DISJOINT ELT(CDAR Y))(GO L1))

                         (T(PRIN1 (CAAR Y))))

                    (GO L3)

          L2        (PRIN1 (CAR P))

          L3        ))))

      (TERPRI)(PRIN1 @ GROUP=)

      (TTAB 20)

      (PRINT (BNR-LSTG (CAR X))))))))))))))

EJECT()

COMMENT(************************

   ALL FUNCTIONS FROM HERE ON ARE INDEPENDENT OF THE

   REPRESENTATION ;THEY ONLY REFER TO SETS BY THE

   ABOVE FUNCTIONS  * * * * * * * * * * * * * * * * * *)

COMMENT(ORBIT1

      ARGS      NODES      A SET

                GROUP      A GROUP OF PERMUTATIONS ON NODES

      VALUE     THE SUBSET OF NODES WHICH IS THE ORBIT

                OF (FIRST NODES) UNDER THE PERMUTATIONS OF

                GROUP                          )

DEFINE(((ORBIT1(LAMBDA(NODES GROUP)

    (PROG(CLASS)

      (SETQ CLASS (FIRST NODES))

        (FOR GROUP ON GROUP

          FOR NEW PERM ON (CYCLESOF(CAR GROUP))

           AS NEW CYCLE IS (SETOF (CAR PERM))

           WHEN (NOT (DISJOINT CYCLE CLASS)) DO

            (SETQ CLASS (UNION CYCLE CLASS)))

      (RETURN (INTERSECT CLASS NODES))))))))

COMMENT(REDUCEGROUP

  ARGS    GROUP  A GROUP OF PERMUTATIONS

          NODES  NODES WHICH HAVE NOW BEEN LABELED

  VAL     THE GROUP OR THE REMAINING STRUCTURE,ONCE

          NODES HAVE BEEN LABELED                                )

DEFINE(((REDUCEGROUP(LAMBDA(GROUP NODES)

     (FOR GROUP ON GROUP

      WHEN (FOR NEW PERM ON (CYCLESOF(CAR GROUP))

           AS NEW CYCLE IS (SETOF (CAR PERM))

            AS NEW X IS (INTERSECT NODES CYCLE)

            AND (OR(EMPTY X)(EQSET X CYCLE)))

       LIST (CAR GROUP)))))))))))))))))))

COMMENT(COMB

  ARGS     NODES   A SET

           NUMBER  NUMBER OF ELEMENTS WANTED IN EACH SUBSET

  VAL      LIST OF ALL SUBSETS OF NODES WITH NUMBER ELEMENTS           )

DEFINE(((COMB(LAMBDA(NODES NUMBER)

 (COND

   ((ZEROP NUMBER)(LIST (NULLSET)))

   ((EMPTY NODES) NIL)

   ((EQUAL NUMBER 1)(LISTELT NODES))

   (T (FOR NEW FN IS (FIRST NODES)

        AS NODES IS (REST NODES)

        AS NEW NN :=((SIZE  NODES) NUMBER -1)

         FOR NEW X IN (COMB NODES (SUB1 NUMBER))

          XLIST (UNION FN X))))))))

EJECT()

COMMENT(MANYLABELGRAPHTOP

    THIS IS A SPECIAL TOP LEVEL FUNCTION WHICH CALLS

    FIRST POLYA AND THEN MANYLABELGRAPH

      IF THE RESULT OF THE POLYA FUNCTION SHOW THAT

    THERE ARE TOO MANY STRUCTURES TO CALCULATE IN A

    REASONABLE LENGTH OF TIME, MANYLABELGRAPH IS NOT

    CALLED

                                                  )

SPECIAL((SZNODES))

DEFINE ((

  (MANYLABELGRAPHTOP (LAMBDA (NODES GROUP LABELS)

        (PROG (X SZNODES)(SETQ SZNODES(SIZE NODES))

            (SETQ LABELS

              (SORTBY

                (LAMBDA (PAIR)

                    (DIFFERENCE

                      (TIMES 0.001 (CDR PAIR))

                      (ABS (DIFFERENCE

                        (TWICE (CDR PAIR))

                        SZNODES))))

                LABELS))

            (SETQ X (POLYA NODES GROUP LABELS))

            (PRINT (CONS X @ (POSSIBLE SUBSTITUTION (S))))

            (COND

              ((GREATERP X 1000)

                (RETURN (PROG2

                  (PRINT @ (THIS IS TOO MANY TO COMPUTE))

                  NIL))))

            (SETQ X (MANYLABELGRAPH NODES GROUP LABELS))

            (PRINT (CONS (LENGTH X) @ (ACTUAL SUBSTITUTIONS MADE)))

            (RETURN X))))

  ))

UNSPECIAL((SZNODES))

EJECT()

COMMENT(MANYLABELGRAPH

     ARGS    NODES    SET TO BE LABELED

             GROUP    PERMUTATION GROUP ON NODES

             LABELS   A LIST OF DOTTED PAIRS OF LABEL,NUMBER

     VAL     LIST OF ALL NONEQUIVALENT LABELINGS OF NODES,

             WHERE EACH LABELING IS A LIST OF THE FORM:

              (GROUP (LABEL . NODES) (LABEL . NODES) (LABEL . NODES))

                                      )

DEFINE(((MANYLABELGRAPH(LAMBDA(NODES GROUP LABELS)

   (COND

     ((FOR LABELS ON LABELS AND (ZEROP(CDAR LABELS))) NIL)

     ((NULL (CDR LABELS))

        (FOR NEW X IN(LABELGRAPH NODES GROUP (CDAR LABELS))

          XLIST (LIST (CDR X)(CONS(CAAR LABELS)(CAR X)))))

     (T (FOR NEW NODGRP IN (LABELGRAPH NODES GROUP (CDAR LABELS))

          FOR NEW LABELING IN

           (MANYLABELGRAPH

             (DIFF NODES (CAR NODGRP))

             (CDR NODGRP)

             (CDR LABELS))

          XLIST

           (*CONS

              (CAR LABELING)

              (CONS (CAAR LABELS) (CAR NODGRP))

              (CDR LABELING))))))))))))))

EJECT()

COMMENT(LABELGRAPH

     ARGS   NODES     SET TO BE LABELED

            GROUP     PERMUTATION GROUP ON NODES

            NUMBER    NUMBER OF LABELS TO BE ATTACHED

     VAL    LIST OF ALL NONEQUIVALENT LABELINGS OF NODES WITH

            )NUMBER> IDENTICAL LABELS, WHERE EACH LABELING

            IS OF THE FORM:

               (NODES . GROUP)

                                                             )

DEFINE(((LABELGRAPH(LAMBDA(NODES GROUP NUMBER)

 (COND

  ((NULL GROUP)(FOR NEW X IN (COMB NODES NUMBER)XLIST(CONS X NIL)))

  ((GREATERP(TWICE NUMBER)(SIZE  NODES))

    (FOR NEW X IN(LABELGRAPH NODES GROUP(DIFFERENCE(SIZE  NODES)NUMBER))

       XLIST (CONS (DIFF NODES (CAR X))(CDR X))))

  ((ZEROP NUMBER)(LIST (CONS (NULLSET) GROUP)))

  (T (PROG (FC RESULT )

    (COND((EQSET NODES(SETQ FC(ORBIT1 NODES GROUP)))

            (RETURN(LABELCLASS NODES GROUP NUMBER))))

    (SETQ NODES (DIFF NODES FC))

   (FOR NEW X :=((MAX 0(DIFFERENCE NUMBER(SIZE NODES)))

                 (MIN NUMBER (SIZE FC))

                 1)

    AS NEW LBLGS IS (SORTBY CDR (LABELCLASS FC GROUP X))

    AS NEW OLDGROUP IS @ UNDEFINED

    AS NEW N-X IS (DIFFERENCE NUMBER X)

    DO

     (FOR LBLGS ON LBLGS

      AS NEW LBLGS2 IS (IF(EQUAL(CDAR LBLGS)OLDGROUP)THEN LBLGS2

                        ELSE(LABELGRAPH NODES(SETQ OLDGROUP(CDAR LBLGS))

                                N-X))

     FOR NEW LBLG2 IN LBLGS2 DO

       (SETQ RESULT(CONS(CONS(UNION(CAAR LBLGS)(CAR LBLG2))

                            (CDR LBLG2))

                        RESULT))))

  (RETURN RESULT))))))))))))))))))))))

COMMENT( OLD DEF OF LABELGRAPH ENDED WITH

DEFINE(((LABELGRAPH(LAMBDA(NODES GROUP NUMBER)

 (COND

  ((NULL GROUP)(FOR NEW X IN (COMB NODES NUMBER)XLIST(CONS X NIL)))

  ((GREATERP(TWICE NUMBER)(SIZE  NODES))

    (FOR NEW X IN(LABELGRAPH NODES GROUP(DIFFERENCE(SIZE  NODES)NUMBER))

       XLIST (CONS (DIFF NODES (CAR X))(CDR X))))

  ((ZEROP NUMBER)(LIST (CONS (NULLSET) GROUP)))

  (T (PROG (FC )

    (COND((EQSET NODES(SETQ FC(ORBIT1 NODES GROUP)))

            (RETURN(LABELCLASS NODES GROUP NUMBER))))

    (SETQ NODES (DIFF NODES FC))

    (RETURN (FOR NEW X :=((MAX 0(DIFFERENCE NUMBER(SIZE  NODES)))

                         (MIN NUMBER (SIZE  FC))

                         1)

             FOR NEW LBL IN (LABELCLASS  FC GROUP X)

       FOR NEW LBL2 IN (LABELGRAPH NODES (CDR LBL)(DIFFERENCE NUMBER X))

        XLIST (CONS(UNION (CAR LBL)(CAR LBL2))(CDR LBL2)))))))))))))))

EJECT()

COMMENT(LABELCLASS

    ARGS     CLASS    A SET

             GROUP    PERMUTATION GROUP ON CLASS, SUCH THAT

                      ALL THE ELEMENTS OF CLASS ARE EQUIVALENT

                      UNDER GROUP

             NUMBER   NUMBER OF LABELS TO ATTACH TO CLASS

    VAL      A LIST OF LABELINGS, AS IN LABELGRAPH ;                )

DEFINE(((LABELCLASS(LAMBDA(CLASS GROUP NUMBER)

 (IF(GREATERP(TWICE NUMBER)(SIZE CLASS))

   THEN

     (FOR NEW X IN

         (LABELCLASS CLASS GROUP (DIFFERENCE(SIZE CLASS)NUMBER))

       XLIST (CONS(DIFF CLASS (CAR X))(CDR X)))

  ELSEIF (ZEROP NUMBER) THEN (LIST(CONS(NULLSET)GROUP))

  ELSEIF (EQUAL NUMBER 1) THEN

    (LIST(CONS(SETQ CLASS(FIRST CLASS))

              (REDUCEGROUP GROUP CLASS)))

  ELSE (LABELGENCLASS CLASS GROUP NUMBER)))))))))))))))))))))

COMMENT(LABELGENCLASS

   CALLS LABELORBITS

   AND THEN REDUCES THE LIST BY

   CHECKING CANONICAL

NOTE THAT AN ALTERNATIVE IS AS FOLLOWS:

   (1)  LABELORBITS COULD CHECK AS

        IT GENERATES

   (2)  THE CHECKING PROCEDURE COULD

        GENERATE A BADLIST, AND THE

       BADLIST WOULD BE ALL THAT NEEDED

      TO BE CHECKED       )))))))))))))))

DEFINE(((LABELGENCLASS(LAMBDA(CLASS GROUP NUMBER)

  (FOR NEW X IN (LABELORBITS(ORBITS CLASS GROUP)NUMBER)

    WHEN (CANONICAL X GROUP)

      XLIST (CONS X (REDUCEGROUP GROUP X))))))))))))))))))

COMMENT(LABELORBITS

   ARGS   ORBITS   A LIST OF SETS DETERMINED FROM THE

                   PERMUTATION GROUP OF THE NODES TO BE LABELED:

                     THE I-TH SET IS THE ORBIT OF

                     THE I-TH NODE UNDER THOSE PERMUTATIONS

                     THAT LEAVE NODE 1 THROUGH NODE (I-1)

                     FIXED ;

          NUMBER   NUMBER OF LABELS TO ATTACH ;

   VAL    A LIST OF SUBSETS OF NODES WITH NUMBER ELEMENTS,

          EACH OF WHICH SATISFY THE RELATION

           IF THE I-TH NODE IS NOT IN S, THEN NO ELEMENT OF

           THE I-TH ORBIT IS IN S ;                        )

COMMENT( TO MAKE THE LABELORBITS FUNCTION

 INDEPENDENT OF WHETHER OR NOT THE LABELINGS

 ARE CHECKED AS THEY ARE GENERATED, OR

 IF THEY ARE ALL GENERATED AND THEN CHECKED,

 LABELORBITS CALLS A FUNCTION LOADD WITH

 EACH NEW LABELING;   LOADD CAN THEN EITHER

 ADD THAT LABELING TO A LIST, OR CHECK IT

 FIRST )))))))))))))))))

SPECIAL((LORESULT))

DEFINE(((LABELORBITS(LAMBDA(ORBITS NUMBER)

  (*PROG2

    (SETQ LORESULT NIL)

    (LO1 ORBITS NUMBER (NULLSET))

    LORESULT)))))))))))

COMMENT (LO1 IS THE WORK HORSE OF LABELORBITS)

COMMENT(LO1 COULD BE MADE PARTIALLY ITERATIVE)

DEFINE(((LO1(LAMBDA(ORBITS NUMBER SET)

 (IF(MINUSP NUMBER)THEN NIL

  ELSEIF(ZEROP NUMBER) THEN (LOADD SET)

  ELSEIF(LESSP(LENGTH ORBITS)NUMBER)THEN NIL

  ELSEIF(EQUAL(LENGTH ORBITS)NUMBER)

   THEN(LOADD(FOR NEW X IN ORBITS UNION FIRST SET

                 (FIRST X)))

  ELSE

    (LO1(CDR ORBITS)NUMBER SET)

    (LO1(FOR NEW O IN (CDR ORBITS)

          WHEN(DISJOINT(FIRST O)(CAR ORBITS))

           LIST O)

        (DIFFERENCE NUMBER (SIZE(CAR ORBITS)))

        (UNION SET(CAR ORBITS))))))))))))))))))))

DEFINE(((LOADD(LAMBDA(NODES)(SETQ LORESULT(CONS NODES LORESULT)))))))

)))))

EJECT()

COMMENT(ORBITS

    ARGS    NODES   A SET

            GROUP   PERMUTATION GROUP ON SET

    VAL     LIST OF ORBITS OF THE I-TH NODE UNDER

            THOSE PERMUTATIONS LEAVING NODES 1 TO

            I-1 FIXED                                   )

DEFINE(((ORBITS(LAMBDA(NODES GROUP)

 (COND

  ((EMPTY NODES)NIL)

  ((NULL GROUP)(LISTELT NODES))

  (T(CONS

      (ORBIT1 NODES GROUP)

      (ORBITS (REST NODES) (REDUCEGROUP GROUP (FIRST NODES))))))))))

EJECT()

DEFINE(((CANONICAL(LAMBDA(NODES GROUP)

  (FOR NEW PERM IN GROUP AND

    (IF (NOT (ORDEROF PERM)) THEN

         (S))PS (LARGESTELT) NODES (CAR(POWERSOF PERM)))

     ELSE (FOR NEW P IN (POWERSOF PERM)

           AS NEW PRED IS (S))PS&P-1S NODES P)

            WHILE (NOT(EQ PRED @ EQL))

               AND PRED))))))))))))))))))))))

EJECT()

COMMENT(S))PS

    ARGS       S      A SET OF NODES

               P      A REPRESENTATION OF A PERMUTATION

                      AS THE LIST

                       -1      -1       -1             -1

                      P  (X ),P  (X ), P  (X ) ,,,    P  (X )

                           1       2        3              N

    VALUE      NIL IF S IS LEXICOGRAPICALLY LESS THAN P(S)

               AND T OTHERWISE

               TO DETERMINE LEXICOGRAPHIC ORDER:

                 ORDER THE ELEMENTS OF S IN THE ORDER

                    X , X , X ,  ,,,   X

                     1   2   3          N

                 ORDER THE ELEMENTS OF P(S) IN THE SAME WAY

                S )) P(S) IF THE FIRST ELEMENT WHERE THEY

                 DIFFER, THE ELEMENT OF S IS AN EARLIER ELEMENT

                 THAN THE CORRESPONDING ELEMENT OF P(S)

    METHOD    AS I GOES FROM X1  TO  XN   (LARGESTELT) BY

                 NEXTSMALLESTELT,

                     -1

                    P  (I) IN S IS THE SAME AS I IN P(S)

                  PROCEDE UNTIL

                    IT IS NO LONGER TRUE THAT

                        I IN S  )==>  I IN P(S)     (I,E, P INVERSE(I) I

C

                  AT THAT POINT,  IF I IS IN S, THEN

                     S>>P(S);   IF I IS IN P(S) THEN

                  S))P(S)

)))))))))))))))))))))))))

DEFINE(((S))PS(LAMBDA(I S P)

  (PROG NIL

L1  (IF (NOT (CONTAINED I S)) THEN

         (IF (CONTAINED(CAR P)S) THEN (RETURN T)

           ELSE (SETQ P (CDR P))

                (SETQ I (NEXTSMALLESTELT I)))

     ELSEIF (NOT(CONTAINED(CAR P)S)) THEN (RETURN NIL)

     ELSEIF (ELTLESSP (SETQ I (NEXTSMALLESTELT I)) S)

        THEN (RETURN @ EQL)

     ELSE (SETQ P (CDR P)))

   (GO L1)))))))))))))))

EJECT()

COMMENT(S))PS&P-1S

      ARGS       S     A SET OF NODES

                 P     A PERMUTATION IN THE SAME NOTATION

                     AS IN S))PS

      VAL       AS IN S))PS, THIS FUNCTION CHECKS IF

                S IS LEXICOGRAPHICALLY LESS THAN  P(S)

                HOWEVER, AT THE SAME TIME IT CHECKS P-1(S)

     METHOD     AS IN S))PS,  I STARTS AT THE LARGESTELT

                AND GOES DOWN BY NEXTSMALLESTELT UNTIL

                S AND P(S)  DISAGREE

                 MEANWHILE,  P-1(S) IS ACCUMULATED IN

                R;  THE COMPLIMENT OF P-1(S) IS ACCUMULATED

                IN NR;

                  A RUNNING CHECK IS MADE ON THE FIRST

                LOCATION WHERE S AND R DISAGREE

                  IF THAT ELEMENT IS CONTAINED IN R, THEN

                IT IS KNOWN THAT P-1(S) >> S, AND IT

                IS ONLY NECESSARY TO CHECK S))P(S) FROM

                 THEN ON;

                  OTHERWISE,  IF XI IS THE LARGEST ELEMENT

                 FOR WHICH S AND R DISAGREE, AND XI IS IN

                 S, THEN IF ALL LARGER ELEMENTS NOT IN

                 S ARE IN NR, THEN WE KNOW THAT

                    S >> P-1(S) AND CAN RETURN    )))))))))))))))))

DEFINE(((S))PS&P-1S(LAMBDA(S P)

    (PROG(I R NR XI LARGERTHAN-XI&NOTIN-S)

     (*SETQ R NR (NULLSET))

    (SETQ LARGERTHAN-XI&NOTIN-S

      (ALLLARGERELTS (SETQ XI (FIRST S))))

     (SETQ I (LARGESTELT))

LOOP(IF (CONTAINED I S) THEN

       (IF (CONTAINED (CAR P) S) THEN

         (COMMENT S AND P(S) AGREE SO FAR; CHECK P-1(S)

            I IS IN S, SO WE ADD (CAR P) TO R)

         (SETQ R (UNION (CAR P) S))

            (IF(CONTAINED(SETQ XI(FIRST(DISJOINTDIFF S R)))R)

              THEN (COMMENT THE LARGEST ELEMENT WHERE S AND R

                     DISAGREE IS IN R;  THUS P-1(S) IS BIGGER

                    THAN S, AND WE NEED ONLY TO CHECK P(S))

                (RETURN(S))PS I S P))

                ELSEIF(AND

                  (CONTAINED(SETQ LARGERTHAN-XI&NOTIN-S

                              (DIFF(ALLLARGERELTS XI)S))

                            NR)

                  (CONTAINED XI NR))

                 THEN (RETURN NIL)

              ELSE NIL)

        ELSE (COMMENT I IN S, NOT IN P(S) MEANS S BIGGER)

             (RETURN NIL))

     ELSEIF (CONTAINED(CAR P)S) THEN

        (COMMENT I NOT IN S, BUT IN P(S) MEANS

          S IS SMALLER THAN P(S); WE NEED TO CHECK

          P-1(S) ONLY FROM NOW ON)

        (GO INVERSE-ONLY)

     ELSE (COMMENT I NOT IN S OR IN P(S);

           SINCE I IS NOT IN S, WE ADD P-1(S) TO

           NR AND CHECK NR)

       (IF(AND(CONTAINED XI(SETQ NR(UNION(CAR P)NR)))

              (CONTAINED LARGERTHAN-XI&NOTIN-S

                         NR))

         THEN (RETURN NIL)

        ELSE NIL)

       )

   (COMMENT GO TO NEXT ELEMENTS)

   (IF(OR(ELTLESSP(SETQ I(NEXTSMALLESTELT I))S)

      (NULL(SETQ P(CDR P))))

    THEN (RETURN(QUOTE EQL)))

    (GO LOOP)

INVERSE-ONLY

    (COMMENT  S))P(S); CHECK IF S))P-1(S))

    (COMMENT AT THIS POINT,  I IS NOT IN S,

     I IS IN P(S);  WE NEED TO ADD P-1(I) TO NR)

    (SETQ NR (UNION I NR))

LOOP2

    (COMMENT R HAS NOT CHANGED FROM LAST TIME;

      THUS XI HAS NOT CHANGED EITHER)

    (IF (AND(CONTAINED XI NR)

            (CONTAINED LARGERTHAN-XI&NOTIN-S

                      NR))

      THEN (RETURN NIL))

    (IF(NULL(SETQ P(CDR P))) THEN (RETURN @ EQL))

    (SETQ I (NEXTSMALLESTELT I))

    (IF(CONTAINED I S) THEN

         (SETQ R (UNION I R))

         (IF(CONTAINED(SETQ XI(FIRST(DISJOINTDIFF S R)))R)

           THEN (RETURN T)

          ELSE NIL)

         (SETQ LARGERTHAN-XI&NOTIN-S

            (DIFF(ALLLARGERELTS XI)S))

         )

     (GO LOOP2))))))))))))))))))))))))))))))

EJECT()

COMMENT(POLYA

    ARGS      NODES             A SET TO BE LABELED

              GROUP             A GROUP OF PERMUTATIONS

                                 ON NODES

              SUBLIST           A COLLECTION OF "LABELS"

                                TO BE ASSIGNED TO NODES

                                IN COMPOSITION LIST FORM

    VAL       THE NUMBER OF WAYS THE LABELS IN SUBLIST

              CAN BE ASSIGNED TO NODES WITHOUT DUPICATION

              UNDER THE PERMUTATIONS OF GROUP

THIS FUNCTION EVALUATES G, POLYA'S FUNCTION FOR THE

 NUMBER OF DOUBLE COSETS OF TWO GROUPS UNDER S(N) ;

        METHOD

   (COMMENT RESET SUBLIST TO AN ORDERED LIST OF THE

      NUMBER OF DIFFERENT SUBSTITUANTS; MUST FILL

      IN IF THE NUMBER OF SUBSTITUANTS IS LESS THAN

      THE NUMBER OF NODES TO LABEL)

  (COMMENT RESET GROUP TO A COMPOSITION LIST

   OF CYCLE INDICES; TH IDENTITY NEEDS TO BE

      FILLED IN;   THE FUNCTION PERMCYCLEINDEX1

      GIVEN A PERMUTATION RETURNS A LIST OF THE

      SIZES OF THE CYCLES OF THE PERM, BUT CYCLES

      OF SIZE ONE ARE NOT INCLUDED;   NOTE ALSO

      THAT EACH PERMUTATION IN THE ORIGINAL GROUP

      STANDS FOR 2 *(LENGTH (ORDEROF PERM)) PERMUTATIONS

      UNLESS ORDEROF IS NIL, IN WHICH CASE IT

      STANDS FOR ONLY ONE PERMUTATION)

 (COMMENT  NOW TO COMPUTE THE COEFICIENT OF

         N1     N2            NK

      X1     X2      ,,,   XK

   IN THE POLYNOMIAL

                         !C!     !C!             !C!

    SUM        PRODUCT(X1    + X2       ,,, + XK    )

   P IN         C CYCLE

    GROUP       OF P

    SUBLIST IS (N1 N2 ,,, NK) AND

    NEWGROUP IS THE POLYNOMIAL

      WITH REDUNDANCIES IN THE SUM AND PRODUCT

      ELIMINATED BY USING COMPOSITION LISTS

                                                                   )

                     )

GSET(INPUTMODE FUNCTION)

DEFINE(((POLYA(LAMBDA(NODES GROUP SUBLIST)

   (PROG(D C NEWGROUP)

   (SETQ SUBLIST (LFROMCL SUBLIST (SIZE NODES)))

(SETQ NEWGROUP (CYCLEINDEX GROUP NODES))

  (SETQ C (FOR NEW PERM IN NEWGROUP PLUS (CDR PERM)))

L1(IF(NULL(CDR SUBLIST))

   THEN (RETURN(QUOTIENT(FOR NEW X IN NEWGROUP PLUS (CDR X))C)))

  (SETQ GROUP NEWGROUP) (SETQ NEWGROUP NIL)

  (FOR NEW X IN GROUP

     FOR NEW S IN (SUBSETS (CAR X)(CAR SUBLIST))

      AS NEW CYCLEFT IS (DIFFCL (CAR X) (CAR S))

      AS NEW FACTOR IS (TIMES (CDR X)(CDR S))

      DO (SETQ NEWGROUP

           (INSERTCL

                 FACTOR

                 CYCLEFT

                 NEWGROUP

                 (FUNCTION(LAMBDA(X Y)(NOT(GEQ X Y)))))))

   (SETQ SUBLIST (CDR SUBLIST))

   (GO L1))))))))))))))

DEFINE(((LFROMCL(LAMBDA(CL N)

 (PROG2

   (SETQ CL (SORT (MAPCAR CL @ CDR) @ LESSP))

   (IF(NOT(ZEROP(SETQ N (DIFFERENCE N (*LUS CL)))))

     THEN (INSERT N CL @ LESSP)

     ELSE CL)))))))))))))))))))

DEFINE(((CYCLEINDEX(LAMBDA(GROUP NODES)

 (PROG(INDEX)

   (FOR NEW PERM IN GROUP

     AS NEW DUPLICITY IS

     (IF(OR(NOT(ORDEROF PERM))(EQ INPUTMODE @ FUNCTION))

        THEN 1

        ELSE (TWICE(LENGTH(ORDEROF PERM))))

     DO

     (SETQ INDEX

       (INSERTCL DUPLICITY

          (PCYCLEINDEX (CYCLESOF PERM)NODES)

          INDEX

          (FUNCTION(LAMBDA(X Y)(NOT(GEQ X Y)))))))

    (RETURN(CONS (CONS(LIST(CONS 1(SIZE NODES)))1)

                  INDEX))))))))))))))))))))))

DEFINE(((PCYCLEINDEX(LAMBDA(CYCLES NODES)

  (PROG(INDEX)

    (FOR NEW CYCLE IN CYCLES

     AS NEW CYCLESIZE IS (SIZE(INTERSECT(SETOF CYCLE)NODES))

     DO (SETQ INDEX (INSERTCL 1 CYCLESIZE INDEX @ LESSP)))

   (RETURN(IF(NOT(ZEROP(SETQ CYCLES

   (DIFFERENCE (SIZE NODES)

      (FOR NEW X IN INDEX PLUS

         (TIMES(CAR X)(CDR X)))))))

      THEN (CONS(CONS 1 CYCLES)INDEX)

      ELSE INDEX)))))))))))))))))))))))))))))))))))

EJECT()

COMMENT(SUBSETS

    ARGS     C   A LIST OF THE FORM

                ((L1 . M1)(L2 . M2) -- (LQ . MQ))

                 THE L'S AND M'S ARE NUMBERS-- THIS REPRESENTS

                 A COLLECTION OF NUMBERS ;THE NUMBERS ARE THE

                 L'S AND THE M'S ARE HOW MANY OF EACH OCCUR;

             N   A NUMBER

    VALUE  A LIST OF DOTTED PAIRS ;THE CAR OF EACH

           IS A SUBCOLLECTION OF C SUCH THAT THE ELEMENTS OF

           THAT SUBCOLLECTION ADD UP TO N ;THE CDR IS THE

           NUMBER OF WAYS THAT SUBCOLLECTION CAN BE FORMED

           FROM THE L'S IF THE L'S WERE ALL DIFFERENT

              E,G,      SUBSETS(((5 . 1)(4 . 2)(1 . 1)) 5)

               YIELDS (((5 . 1)) . 1)

                      (((4 . 1)(1 . 1)) . 2)

                 SINCE 5 CAN BE OBTAINED BY TAKING ONE 5 IN

                 ONE WAY ;OR BY TAKING A FOUR AND A ONE IN TWO

                 DIFFERENT WAYS;

                                                         )

DEFINE(((SUBSETS(LAMBDA(C N)

 (COND

   ((ZEROP N)@((NIL . 1)))

   ((FOR C ON C AND (GREATERP (CAAR C) N)) NIL)

           (COMMENT GET RID OF NUMBERS AT HEAD THAT ARE TOO BIG)

            (COMMENT RETURN NIL WHEN THEY ALL ARE TO BIG)

   (T (FOR NEW I :=(1 (CDAR C)) AS NEW II :=((CAAR C) N (CAAR C))

              (COMMENT THE FIRST ELEMENT OF THE NEW SUBSET

                IS THE FIRST OF THE OLD ;TRY UP TO HOW MANY

                ON THE OLD ;I IS THE NUMBER OF TIMES IT

                OCCURS AND II IS THE AMOUNT TAKEN ;IT IS

                UPPER-BOUNDED BY N)

        AS NEW X IS (SUBSETS (CDR C) (DIFFERENCE N II))

              (COMMENT TRY EVERY SUBSET OF THE REST ADDING UP TO N-II)

         WHEN X AS NEW FACTOR IS (TAKEN (CDAR C) I)

              (COMMENT X MUST NOT BE NIL ;THE FACTOR IS THE NUMBER

                OF WAYS OF TAKING I ELEMENTS OUT OF THE (CDAR C) ELEMENT

                AVAILABLE)

          FOR X ON X

       XLIST FIRST (SUBSETS (CDR C) N)

               (COMMENT THE FIRST OF THE LIST IS ALL SUBSETS WITHOUT

                 USING THE FIRST OF C)

         (CONS (CONS(CONS(CAAR C)I)(CAAR X)) (TIMES FACTOR(CDAR X)))))))

)))))))))))))

COMMENT(DIFFCL

     ARGS     L1, L2      TWO COMPOSITION LISTS

     VAL      THE DIFFERENCE (L1 - L2)            )

DEFINE(((DIFFCL(LAMBDA(L1 L2)

  (FOR NEW X IN L1

    AS NEW N IS (DIFFERENCE(CDR X)(ASSOC(CAR X)L2 0))

    WHEN (GREATERP N 0)

     LIST (CONS(CAR X) N))))))))))))))))))

COMMENT(INSERTCL

   ARGS      NUMBER       THE NUMBER OF THIS TYPE OF ELEMENT TO INSERT

             ELEMENT      THE ELEMENT TO INSERT

             OLDCL        THE COMPOSITION LIST THAT NUMBER ELEMENTS

                            ARE TO BE INSERTED INTO

             ORDERF       A COMPARISON FUNCTION WHICH RETURNS

                           NIL IF THE TWO ARGUMENTS ARE EQUAL

                               OR IF THE FIRST SHOULD COME AFTER

                                  THE SECOND IN THE COMPOSITION LIST

  VAL        OLDCL, WITH NUMBER ELEMENTS ADDED

             OLDCL IS ASSUMED TO BE PREVIOUSLY SORTED BY ORDERF  )

DEFINE(((INSERTCL(LAMBDA(NUMBER ELEMENT OLDCL ORDERF)

 (IF (OR(NULL OLDCL)(ORDERF ELEMENT (CAAR OLDCL)))

   THEN (CONS(CONS ELEMENT NUMBER)OLDCL)

  ELSEIF (NOT(ORDERF (CAAR OLDCL) ELEMENT))

   THEN (RPLACD (CAR OLDCL) (PLUS (CDAR OLDCL) NUMBER))

        OLDCL

  ELSE

   (FOR NEW CL ON OLDCL DO

     (IF (OR (NULL(CDR CL)) (ORDERF ELEMENT (CAADR CL)))

       THEN (RETURN (RPLACD CL (CONS(CONS ELEMENT NUMBER)(CDR CL))))

      ELSEIF (NOT (ORDERF (CAADR CL) ELEMENT))

       THEN (RETURN (RPLACD (CADR CL) (PLUS (CDADR CL) NUMBER)))))

    OLDCL))))))))))))))

EJECT()

COMMENT(CHECK IS A FUNCTION WHICH TAKES TWO

ARGUMENTS, A FUNCTION NAME, AND A LAMBDA EXPRESSION ;

THE LAMBDA VARIABLES SHOULD MATCH IN NUMBER AND

TYPE THE LAMBDA ARGUMENTS OF THE FUNCTION NAMED ;

THE EXPRESSION PART OF THE LAMBDA EXPRESSION SHOULD

EVALUATE THE THE EXPECTED LENGTH OF THE RESULT OF

THE FUNCTION NAMED ;

   CHECK REDEFINES THE FUNCTION TO CHECK ITS RESULTS

AGAINST THE GIVEN LAMBDA EXPRESSION AND TO PRINT

A MESSAGE IF THE LENGTH OF THE VALUE OF THE FUNCTION

DOES NOT MATCH THE VALUE OF THE EXPRESSION ;

CHECK CAN BE USED WITH POLYA TO CHECK MOST OF

THE FUNCTIONS IN THE DOUBLE COSET GENERATOR

                                           )

DEFINE(((CHECK(LAMBDA(FN LEXP)

  (PROG(NF)

    (SETQ NF(COMPRESS(LIST FN @ *CHK)))

    (COND((GET FN @ SUBR)

      (PROG2(PUTPROP NF(GET FN @ SUBR)@ SUBR)(REMPROP FN @ SUBR)))

         ((GET FN @ EXPR)(PUTPROP NF(GET FN @ EXPR)@ EXPR))

         (T (RETURN @(? FN NOT EXPR OR SUBR))))

    (DEFINE @((? FN (LAMBDA ?(CADR LEXP)

       (PROG(CNT RES)

         (SETQ RES ?(CONS NF (CADR LEXP)))

         (SETQ CNT ?(CADDR LEXP))

         (COND((EQUAL(LENGTH RES)CNT)(RETURN RES)))

         (PRINT(QUOTE (ERROR IN:)))

         (PRIN1 (QUOTE ? FN))

         (PRINT ?(CONS @ LIST (CADR LEXP)))

         (PRIN1 (QUOTE "PREDICTED NUMBER="))

         (PRINT CNT)

         (PRIN1 (QUOTE "ACTUAL NUMBER="))

         (PRINT (LENGTH RES))

         (PRIN1 (QUOTE "VALUE IS="))

         (PRINT RES)

         (EXITERR T)

         (ERROR (QUOTE ? FN))))))))))))))))))))))))

COMMENT((PERMUTATION FUNCTIONS))

FIXDEFINE((COMPILE))

DEFINE(((MAPPINGS(LAMBDA(A A2 B)

  (COND((NULL A)(LIST B))

       ((NULL B)NIL)

    ((NOT(MEMBER(CAR B)A))(MAPCONS(CAR B)(MAPPINGS A A2 (CDR B))))

       (T(IMAGES A2 NIL A B))))))))))

DEFINE(((IMAGES(LAMBDA(A2A A2B A B)

  (COND((NULL A2A) NIL)

      (T(APPEND

         (MAPCONS(CAR A2A)(MAPPINGS(CDR A)(APPEND(CDR A2A)A2B)(CDR B)))

        (IMAGES(CDR A2A)(CONS(CAR A2A)A2B)A B)))))))))))))))))

DEFINE(((MAPCONS(LAMBDA(X L)(MAPCAR L(FUNCTION(LAMBDA(Y)(CONS X Y)))))))

))))))))))

DEFINE(((D1(LAMBDA(I N Y A)

 (COND((GREATERP I N) NIL)

      ((NULL Y) (CONS I (D1 (ADD1 I) N A A)))

      ((NOT(EQUAL I (CAR Y)))(D1 I N (CDR Y) A))

      ((CDR Y) (CONS (CADR Y) (D1 (ADD1 I) N A A)))

      (T (CONS (CAR A) (D1 (ADD1 I) N A A)))))))))))))))

DEFINE(((D2(LAMBDA(A N)(D1 1 N A A)))))))

DEFINE(((XTIMES1(LAMBDA(X I P)

 (COND((EQUAL X I)(CAR P))

      (T(XTIMES1 X (ADD1 I) (CDR P)))))))))

DEFINE(((XTIMES(LAMBDA(X P)(XTIMES1 X 1 P)))))))

DEFINE(((PTIMES(LAMBDA(P1 P2)

(MAPCAR P1(FUNCTION(LAMBDA(Z)(XTIMES Z P2))))))))))

DEFINE(((CYCLICGENBY(LAMBDA(P)

 (CYC1 P (PTIMES P P)))))))))

DEFINE(((CYC1(LAMBDA(P1 P2)

   (COND((EQUAL P1 P2)(LIST P1))

        (T(CONS P2 (CYC1 P1 (PTIMES P1 P2)))))))))))))))

DEFINE(((DIRECTPRODUCT(LAMBDA(G1 G2)

 (COND((NULL G1) NIL)

      (T(DP1 (CAR G1) G2 (DIRECTPRODUCT (CDR G1) G2))))))))))

DEFINE(((DP1(LAMBDA(P G PRD)

 (COND((NULL G) PRD)

      (T(DP2 (PTIMES P (CAR G)) P G PRD))))))))

DEFINE(((DP2(LAMBDA(PCG P G PRD)

  (COND((MEMBER PCG PRD)(DP1 P (CDR G) PRD))

       (T(DP1 P (CDR G) (CONS PCG PRD)))))))))))))

DEFINE(((IDENTITY(LAMBDA(N)

   (ID1 1 N)))))))))))

DEFINE(((ID1(LAMBDA(I N)

   (COND((GREATERP I N)NIL)

        (T(CONS I(ID1(ADD1 I)N)))))))))))))))

DEFINE(((SN(LAMBDA(A N)(MAPPINGS A A (IDENTITY N))))))))

DEFINE(((R1(LAMBDA(A B N)

 (COND((GREATERP(LENGTH A)(ADD1(LENGTH B)))

           (R1(CDR A)(CONS(CAR A)B) N))

      ((NULL B)(IDENTITY N))

      (T(PTIMES(CADR(SN(LIST(MIN(CAR A)(CAR B))(MAX(CAR A)(CAR B)))N))

               (R1(CDR A)(CDR B)N)))))))))))

DEFINE(((REFLECTION(LAMBDA(A N)(R1 A NIL N)))))))

DEFINE(((DIHEDRAL(LAMBDA(A N)

 (DIRECTPRODUCT(LIST(REFLECTION A N)(IDENTITY N))

    (CYCLICGENBY (D2 A N)))))))))))))

DEFINE(((PRISM(LAMBDA(A B N)

 (DIRECTPRODUCT(LIST(R1 A B N)(IDENTITY N))

    (PR1(DIHEDRAL A N)(R1 A B N)))))))))

DEFINE(((PR1(LAMBDA(N P)

  (MAPCAR N(FUNCTION(LAMBDA(X)(PTIMES X (PTIMES P (PTIMES X P))))))))))

DEFINE(((GROUPGENBY(LAMBDA(G)

    (GG1 G G G)

))))))

DEFINE(((GG1(LAMBDA(G1 G2 G)

 (COND((NULL G1)G)

      ((NULL G2)(GG1(CDR G1)(CDR G1)G))

      (T(GG2(PTIMES(CAR G1)(CAR G2))G1 G2 G)))))))

DEFINE(((GG2(LAMBDA(G1*2 G1 G2 G)

   (COND((MEMBER G1*2 G)(GG1 G1 (CDR G2) G))

        (T(PROG2(RPLACD G2(CONS G1*2 (CDR G2)))

                (GG1 G1 (CDR G2) G)))))))))))

OPEN(CYCORE5 SYSFILE OUTPUT)CHKPOINT(CYCORE5)CLOSE(CYCORE5)

EJECT()

COMMENT( METHODS OF INCREASING EFFICIENCY OF THIS PROGRAM

 (1) ALLOW THE POSSIBILITY OF A GROUP BEING REPRESENTED AS

     A DIRECT PRODUCT OF GROUPS, OR OF A GROUP BEING REPRESENTED

     BY ITS GENERATORS -- THIS PERHAPS WILL SIMPLIFY REDUCEGROUP

     ORBITS, ETC

 (2) COMB SHOULD NOT RETURN ALL COMBINATIONS, BUT A SPECIAL FORM ;

     ALL OTHER FUNCTIONS SHOULD BE ABLE TO HANDLE THIS FORM

     OF A LABELING

 (3) IT MAY BE POSSIBLE TO INCORPERATE THE CANONICAL TEST INTO

     THE LABELORBITS PROCEDURE -- THIS WOULD BE A LARGE SAVINGS

 (4) IF NOT, IT MAY BE POSSIBLE TO DETECT IN ADVANCE WHICH PERMS

     MIGHT POSSIBLY TAKE X INTO A SMALLER X

 (6) ANOTHER REPRESENTATION FOR PERMUTATIONS, MORE SUITED TO

     THE MPERM ROUTINE, CAN BE ADDED & CARRIED ALONG BY ADDING

     ANOTHER ATTRIBUTE TO PERMUTATIONS

 (7) IN ALMOST ALL CASES, IT IS EASY TO COMPUTE P**1 X WHEN

     COMPUTING P X ;THIS WOULD REDUCE CANONICAL GREATLY

 (8) CARRY ALONG WITH EACH PERMUTATION P** SUCH THAT N IS RELATIVELY

     PRIME TO ALL OF THE CYCLE LENGTHS OF P -- THUS INSTEAD OF

     APPLYING P TO X A COMPUTED NUMBER OF TIMES, ONE APPIES THESE

     TO X ONCE EACH -- COMPUTATION CAN BE SAVED THIS WAY

 (9) IF THE COMBONITORIC TAKEN RELATIVELY PRIME, ETC ARE TAKING

     TOO MUCH TIME, PUT PART OF THE VALUES IN TABLES

THINGS TO DO TO MAKE IT A NICER PROGRAM

 (1) INPUT ONLY THE GENERATORS OF THE GROUP RATHER THAN THE WHOLE GROUP

 (2) FIX UP OUTPUT

)))))))))))))))))))))))))))

COMMENT(